/**
 * Xinfei.com Inc.
 * Copyright (c) 2004-2023 All Rights Reserved.
 */
package com.xinfei.techplayprod.biz.mq;

import com.xinfei.xfframework.common.starter.mq.MqTemplate;
import org.apache.rocketmq.client.producer.SendCallback;
import org.apache.rocketmq.client.producer.SendResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.messaging.Message;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import java.util.List;

/**
 * 消息发送帮助类
 *
 * @author Chengsheng.Li
 * @version $ Constants, v 0.1 2023/8/29 09:54 Chengsheng.Li Exp $
 */
@Component
public class MqSendUtil {

    private static MqTemplate mqTemplate;

    @Autowired
    private MqTemplate mqTemplateInner;

    @PostConstruct
    public void init() {
        mqTemplate = mqTemplateInner;
    }

    /*
     * 消息同步发送
     * @parm topic 消息名称,如果需要指定tag，可以采取如topic:tag
     * @parm msg 消息体
     * @return 消息结果
     * */
    public static SendResult syncSend(String topic, Object msgObj) {
        return mqTemplate.syncSend(topic, msgObj);
    }

    /*
     * 消息同步发送
     * @parm topic 消息名称,如果需要指定tag，可以采取如topic:tag
     * @parm msg 消息体
     * @parm key 关键业务信息，会将此信息放到消息header中，后续通过MessageExt.getKeys获取
     * @return 消息结果
     * */
    public static SendResult syncSend(String topic, Object msg, String key) {
       return mqTemplate.syncSend(topic, msg, key);
    }

    /*
     * 消息同步发送，可以带消息头
     * @parm topic 消息名称,如果需要指定tag，可以采取如topic:tag
     * @pram msg 字符串格式的消息对象，可以指定消息头,可以根据MessageBuilder<String> builder = MessageBuilder.withPayload(msg); 指定header
     * @return 消息发送结果
     * */
    public static SendResult syncSend(String topic, Message<Object> msg) {
        return mqTemplate.syncSend(topic, msg);
    }


    /*
     * 消息同步批量发送
     * @parm topic 消息名称,如果需要指定tag，可以采取如topic:tag
     * @pram msgs 字符串格式的批量消息对象，可以指定消息头，批量发送一次不能超过20条
     * @return 消息发送结果
     * */
    public static SendResult syncSend(String topic, List<Message<Object>> msgObjs) {
        return mqTemplate.syncSend(topic, msgObjs);
    }


    /*
     * 消息同步发送
     * @parm topic 消息名称,如果需要指定tag，可以采取如topic:tag
     * @parm msg 消息体
     * @return 消息结果
     * */
    public static  SendResult sendMessageInTransaction(String topic, Object msg, final Object arg) {
        return mqTemplate.sendMessageInTransaction(topic, msg, arg);
    }

    /*
     * 消息同步发送
     * @parm topic 消息名称,如果需要指定tag，可以采取如topic:tag
     * @parm msg 消息体
     * @parm key 关键业务信息，会将此信息放到消息header中，后续通过MessageExt.getKeys获取
     * @return 消息结果
     * */
    public static SendResult sendMessageInTransaction(String topic, Object msg, String key, final Object arg) {
        return mqTemplate.sendMessageInTransaction(topic, msg,key, arg);
    }

    /*
     * 消息同步发送，可以带消息头
     * @parm topic 消息名称,如果需要指定tag，可以采取如topic:tag
     * @pram msg 字符串格式的消息对象，可以指定消息头,可以根据MessageBuilder<String> builder = MessageBuilder.withPayload(msg); 指定header
     * @return 消息发送结果
     * */
    public static SendResult sendMessageInTransaction(String topic, Message<Object> msgObj, final Object arg) {
        return mqTemplate.sendMessageInTransaction(topic, msgObj, arg);
    }



    /*
     * 异步消息发送
     * @parm topic 消息名称,如果需要指定tag，可以采取如topic:tag
     * @parm msg 字符串消息体
     * */
    public void asyncSend(String topic, Object msg) {
        mqTemplate.asyncSend(topic, msg);
    }

    /*
     * 异步消息发送
     * @parm topic 消息名称,如果需要指定tag，可以采取如topic:tag
     * @parm msg 字符串消息体
     * @parm key 关键业务信息，会将此信息放到消息header中，后续通过MessageExt.getKeys获取
     * */
    public static void asyncSend(String topic, Object msg, String key) {
        mqTemplate.asyncSend(topic, msg, key);
    }

    /*
     * 异步消息发送
     * @parm topic 消息名称,如果需要指定tag，可以采取如topic:tag
     * @parm msg 带附加信息的消息体
     * */
    public static void asyncSend(String topic, Message<Object> msg) {
        mqTemplate.asyncSend(topic, msg);
    }

    /*
     * 异步消息批量发送
     * @parm topic 消息名称,如果需要指定tag，可以采取如topic:tag
     * @parm msgs 带附加信息的批量消息体
     * */
    public static void asyncSend(String topic, List<Message<Object>> msgs) {
        mqTemplate.asyncSend(topic, msgs);
    }

    /*
     * 异步消息批量发送
     * @parm topic 消息名称,如果需要指定tag，可以采取如topic:tag
     * @parm msg 字符串格式的消息体
     * @parm callback 回调函数
     * */
    public static void asyncSend(String topic, Object msg, SendCallback callback) {
        mqTemplate.asyncSend( topic,  msg,  callback);
    }

    /*
     * 异步消息批量发送
     * @parm topic 消息发送名称
     * @parm msg 带附加属性格式的消息体
     * @parm callback 回调函数
     * */
    public static void asyncSend(String topic, Message<Object> msg, SendCallback callback) {
        mqTemplate.asyncSend(topic, msg, callback);
    }

    /*
     * 异步消息批量发送
     * @parm topic 消息名称,如果需要指定tag，可以采取如topic:tag
     * @parm msgs 带附加信息的批量消息体,一次不能超过20条
     * @parm callback 回调函数
     * */
    public static void asyncSend(String topic, List<Message<Object>> msgObjs, SendCallback callback) {
        mqTemplate.asyncSend(topic,msgObjs,callback);
    }


}
